#include <FS.h>
#include "ioUserSettings.h"
#include "ioSerial.h"
#include "ioMQTT.h"

#define FIRMWARE_VERSION 0.3
StaticJsonDocument<1024> ConfigData;

#if (HAS_IRF == 1)
RCSwitch mySwitch = RCSwitch(); //无线电收发库
IRsend *ir_send = NULL;         //红外发送
IRrecv *ir_recv = NULL;         //红外接收

/************************************************************************
* 函数名称: loadPin()
* 输入参数: 无
* 返回值  : 无
* 功    能: 加载功能引脚
**********************************************************************/
void loadPin()
{
    //红外发送初始化
    int pin = 14;
    if (pin > 0)
    {
        if (ir_send != NULL)
            delete ir_send;
        ir_send = new IRsend(pin);
        ir_send->begin();
    }
    //红外接收初始化
    pin = 5;
    if (pin > 0)
    {
        if (ir_recv != NULL)
            delete ir_recv;
        const uint8_t kTimeout = 50;
        const uint16_t kCaptureBufferSize = 1024;
        ir_recv = new IRrecv(pin, kCaptureBufferSize, kTimeout, true);
        ir_recv->disableIRIn();
        DEBUGF("load recv pin %d\n", pin);
    }
}
#else
void loadPin()
{
}
#endif

/************************************************************************
* 函数名称: settingsSave()
* 输入参数: 无
* 返回值  : 无
* 功    能: 保存设置
**********************************************************************/
bool settingsSave()
{
    DEBUGLN("Save Config");
    serializeJsonPretty(ConfigData, IO_DEBUG);

#if HAS_SPIFFS
#endif

    ESP.flashEraseSector(CONFIG_ADDR);
    uint32_t *caches = (uint32_t *)malloc(1024);
    memset(caches, 0, 1024);
    serializeJson(ConfigData, (char *)caches, 1020);
    ESP.flashWrite(CONFIG_ADDR << 12, caches, 1024);

    mqttDisconnect();
    mqttReconnect();
    return true;
}

/************************************************************************
* 函数名称: settingsLoad()
* 输入参数: 无
* 返回值  : 无
* 功    能: 加载设置
**********************************************************************/
bool settingsLoad()
{
    ConfigData.clear();
#if HAS_SPIFFS
    SPIFFS.begin();
#endif
    uint32_t *caches = (uint32_t *)malloc(1024);
    memset(caches, 0, 1024);
    ESP.flashRead(CONFIG_ADDR << 12, caches, 1020);
    char *jsons = (char *)caches;
    String json = "";
    int i = 0;
    if (jsons[0] != 0xff)
    {
        while (jsons[i] != 0)
        {
            json += jsons[i];
            i++;
        }
    }
    Serial.print(json);
    DeserializationError error = deserializeJson(ConfigData, json);
    free(caches);
    if (error)
    {
        ConfigData.clear();
        ConfigData["version"] = FIRMWARE_VERSION;
        ERRORLN("Failed to load settings");
    }
    DEBUGLN("Load config data:");
    serializeJsonPretty(ConfigData, IO_DEBUG);
    DEBUGLN();

    return true;
}

/************************************************************************
* 函数名称: settingsClear()
* 输入参数: 无
* 返回值  : 无
* 功    能: 清空设置
**********************************************************************/
void settingsClear()
{
    DEBUGLN("Reset settings");
    WiFi.disconnect(true);
    delay(3000);

#if HAS_SPIFFS
    SPIFFS.format();
#endif
    ESP.flashEraseSector(CONFIG_ADDR);

    ESP.reset();
}